import store from "../utils/store"
import { valIsNull } from "../utils/utils"

let mock = false
let mockUrl = "http://192.168.5.77:45865/"

let mockRequestPath = [
	"api/wx/xshy/chk-verified-state",
	"api/wx/xshy/get-init-params",
	"api/wx/xshy/get-verified-result",
	"api/wx/xshy/verify",
]

const API_CONFIG = {
	debug: true,
	// devUrl: "https://xwxpro.gzzmedu.com:1443/xshy/",
	devUrl: "http://192.168.7.245:8018/",
	productionUrl: "https://xwxpro.gzzmedu.com:1443/xshy/",
}

export function getBaseUrl() {
	//判断当前小程序是开发板还是正式版，取各自不同的接口地址
	const accountInfo = wx.getAccountInfoSync()
	if (["develop"].includes(accountInfo.miniProgram.envVersion)) {
		// if (["develop", "trial"].includes(accountInfo.miniProgram.envVersion)) {
		return API_CONFIG.devUrl
	} else {
		return API_CONFIG.productionUrl
	}
}

//发送请求，config.noAuth为true时代表请求不需要token；config.showLoading为true时代表请求时显示loading；config.errorHandle为true时代表请求出错时显示错误信息；config.row为true时代表不处理返回数据，直接返回res
export default function (config) {
	function redirectToLogin() {
		//跳转到登录页
		let pages = getCurrentPages()
		let currentPage = pages[pages.length - 1]
		//如果当前页面不是登录页，则跳转到登录页
		if (
			currentPage &&
			!currentPage.route.startsWith(
				"informationVerification/pages/login/index/index",
			)
		) {
			wx.redirectTo({
				url: "/informationVerification/pages/login/index/index",
			})
		}
		//清除token
		store.token.set("")
	}

	return new Promise((resolve, reject) => {
		let baseURL = getBaseUrl()
		let method
		if (config.method) {
			method = config.method.toUpperCase()
			//默认post请求
		} else {
			method = "POST"
		}
		const data = config.data || {}
		//没有token跳转到登录页
		const token = store.token.get()
		//如果请求不需要token，则不需要判断token是否存在
		if (!config.noAuth) {
			if (!token) {
				redirectToLogin()
			} else {
				data.token = token
			}
		}
		// 判断是否需要拼接处理 url
		let url
		// 如果是完整的url，则不需要拼接
		if (config.url.includes("http")) {
			url = config.url
		} else {
			//解决url中出现的重复 // 问题
			if (baseURL.endsWith("/") && config.url.startsWith("/")) {
				config.url = config.url.substr(1)
			}
			// mock服务额外处理baseUrl
			if (mock) {
				// if (mock && mockRequestPath.includes(config.url)) {
				url = mockUrl + config.url
			} else {
				url = baseURL + config.url
			}
		}
		//打印请求日志
		if (API_CONFIG.debug && config) {
			console.log(`调用接口${url}，参数为`, config.data)
		}
		// 显示loading
		if (config.showLoading) {
			wx.showLoading({
				title: "加载中",
			})
		}
		wx.request({
			...config,
			url,
			method,
			data,
			timeout: 10000,
			success: (res) => {
				if (API_CONFIG.debug) {
					console.info(`调用接口${url}，response内容为`, res.data)
				}
				let resolveParams
				let rejectParams
				// 不需要处理返回数据
				if (config.row) {
					resolve(res)
				} else {
					resolveParams = res.data.data
					if (res.data.msg) {
						rejectParams = res.data.msg
					} else if (res.data.errmsg) {
						rejectParams = res.data.errmsg
					}
				}
				switch (res.data.errorCode) {
					//接口请求成功
					case "0":
					case "200":
						resolve(resolveParams)
						break
					//token 错误或者已过期
					case "-1004":
						redirectToLogin()
						//如果需要错误处理
						if (config.errorHandle) {
							wx.showToast({
								title: "登录已过期，请重新登录",
								icon: "none",
								duration: 3000,
							})
						}
						reject(rejectParams)
						break
					//接口请求出现异常
					default:
						//如果需要错误处理
						if (config.errorHandle) {
							wx.showToast({
								title: rejectParams,
								icon: "none",
								duration: 2000,
							})
						}
						reject(rejectParams)
						break
				}
			},
			fail: (err) => {
				//判断是否是网络超时
				// 判断是否是因为超时而导致的请求失败
				if (err.errMsg.indexOf("timeout") > -1) {
					wx.showModal({
						title: "提示",
						content: "网络超时，请稍后重试",
						showCancel: false,
					})
					reject("网络异常，请稍后重试")
					return
				}
				console.log(err, "接口报错???!", config)
				// 如果需要错误处理
				if (config.errorHandle) {
					wx.showToast({
						title: JSON.stringify(err),
						icon: "none",
						duration: 2000,
					})
				}
				reject("网络异常，请稍后重试")
			},
			// 请求完成后隐藏loading
			complete: () => {
				if (config.showLoading) {
					wx.hideLoading()
				}
			},
		})
	})
}
